%% 1.旋转因子放大误差测试
clear
N = 1024;
amp_factor = 2^16;
for K=0:1:N/4-1
    Wn(K+1,1) = exp(-i*2*pi*K/N);
    Wn(K+1,2) = Wn(K+1,1)*amp_factor;
    Wn(K+1,3) = round(Wn(K+1,2));
    Wn(K+1,4) = Wn(K+1,3)-Wn(K+1,2);
end
for K=1:1:N/4
    wn(K,:) = [0,1,2,3]*K;
end
%% 2.测试FFT频域分析
% 设置采样率和信号频率
fs = 500; % 采样率
f1 = 5; % 信号频率1
f2 = 10; % 信号频率2
T = 1; % 时宽1秒
n = round(T * fs); % 采样点个数
t = linspace(0, T, n); % 时域横坐标

% 生成信号
x = 3 + cos(2 * pi * f1 * t) + 2 * cos(2 * pi * f2 * t); % 三频信号

% 绘制时域图
figure('Name','时域图')
plot(t, x),grid on
xlabel('t/s');
title('时域图');

% 进行FFT变换
X_fft = fft(x);
X_fft_shift = fftshift(X_fft / n); % 离散傅里叶变换并移位
f = linspace(-fs/2, fs/2 - 1, n); % 频域横坐标

% 绘制频谱图和时域图
figure('Name','频谱图')
subplot(3,1,1)
plot(t, x),grid on
xlabel('t/s');
title('时域图');
subplot(3,1,2)
plot(f, abs(X_fft_shift)),grid on
xlabel('f/Hz');
ylabel('幅度');
title('频谱图')
subplot(3,1,3)
plot(f, abs(X_fft)),grid on
xlabel('f/Hz');
ylabel('幅度');
title('未位移的FFT数据')
%% 3.蝶形运算矩阵和数据地址计算
clear
N_bit = 8;
for series=0:N_bit-1
    [ADD1,ADD2,ADD3] = matrix_add(N_bit,series);%验证三套不同的运算矩阵和数据地址的算法
    for X = 1:length(ADD1(:,1))
        for Y = 1:length(ADD1(1,:))
            error1(X,Y) = abs(ADD1(X,Y)-ADD1(X,Y));
            error2(X,Y) = abs(ADD1(X,Y)-ADD2(X,Y));
            error3(X,Y) = abs(ADD1(X,Y)-ADD3(X,Y));
        end
    end
    error_max(series+1,:) = [max(max(error1)),max(max(error2)),max(max(error3))];
end
disp(['最大误差为:',num2str(max(max(error_max)))])
%% 4.基2-FFT与自带FFT的误差对比
clear
%构建采样数据数组
n = 1024;%采样率
x = linspace(0,1,n);
y = sin(20*pi*x);%采样的原始时域信号
figure('Name','基2-FFT原始数据')
plot(y)
%FFT运算
data_in = y;
Xdata_out2 = XFFT_2(data_in);
data_out = fft(data_in);
%基2-FFT与自带FFT的误差计算
error = zeros(1,n);
for K=1:1:length(data_out)
    error(K) = Xdata_out2(K)-data_out(K);
end
error_max = max(error);
disp(['基2-FFT与自带FFT的最大误差为:',num2str(error_max)])
%频域横坐标转换
% f = linspace(0, n/2 - 1, n/2); % 频域横坐标
f = linspace(-n/2, n/2 - 1, n); % 频域横坐标
%频谱与误差图
figure('Name','基2-FFT误差对比图')
subplot(3,1,1)
plot(f, abs(data_out(1:1:length(data_out)))),grid on
title('MATLAB自带的FFT')
subplot(3,1,2)
plot(f, abs(Xdata_out2(1:1:length(data_out)))),grid on
title('基2-FFT')
subplot(3,1,3)
plot(f, abs(error)),grid on
title('自带的FFT与基2-FFT误差',['最大误差:',num2str(error_max)])
%% 5.基4-FFT与自带FFT的误差对比
clear
%构建采样数据数组
n = 1024;
x = linspace(0,1,n);
y = sin(20*pi*x);
figure('Name','基4-FFT原始数据')
plot(y)
%FFT运算
data_in = y;
Xdata_out4 = XFFT_4(data_in);
data_out = fft(data_in);
%基4-FFT与自带FFT的误差计算
error = zeros(1,n);
for K=1:1:length(data_out)
    error(K) = Xdata_out4(K)-data_out(K);
end
error_max = max(error);
disp(['基4-FFT与自带FFT的最大误差为:',num2str(error_max)])
%频域横坐标转换
% f = linspace(0, n/2 - 1, n/2); % 频域横坐标
f = linspace(-n/2, n/2 - 1, n); % 频域横坐标
%频谱与误差图
figure('Name','基4-FFT误差对比图')
subplot(3,1,1)
plot(f, abs(data_out(1:1:length(data_out)))),grid on
title('MATLAB自带的FFT')
subplot(3,1,2)
plot(f, abs(Xdata_out4(1:1:length(data_out)))),grid on
title('基4-FFT')
subplot(3,1,3)
plot(f, abs(error)),grid on
title('自带的FFT与基4-FFT误差',['最大误差:',num2str(error_max)])
